この章のテーマ §
文字列を連結する方法のバリエーションについて学びます。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, strning型
解説 §
文字列を連結する方法はとても沢山あります。
サンプルソースでは7つの方法を紹介しています。
最も簡単な方法は文字列と文字列を+演算子で結びつける方法です。string型の変数aとbがあるとき、a+bで文字列を連結できます。
しかし、他の方法も多くあり、様々なソースなどを見ているとそれらに遭遇することもありますから、他の方法も知っておくと良いと思います。
全ての方法は一長一短があり、速度や可読性の問題からどれが良いとも言いきれません。特に実行速度は環境やデータによって変動するので、どれが最速とも言えません。
取りあえず、ビギナーは深く考えないで+演算子で連結しても良いでしょう。他の方法は、それで上手く行かないケースに遭遇してから検討しても良いと思います。
罠の数々 §
- 実は、Console.WriteLineメソッドではToStringメソッドは呼ばなくても文字列として扱ってくれる。呼んでも呼ばなくても同じ結果になることがサンプルソースの実行結果から分かる
- 昔は、StringBuilderクラスを使うと速いと言われていたが、改良が進んだ結果そうでもなくなっている。単に、文字列を連結するだけなら特にStringBuilderクラスを使う理由はない
- 複数の文字列を結合するだけなら、string.Concatメソッドの利用は割とお勧めである
- 【方法5 Console.WriteLine法】はコンソールに出力する場合にしか使えないように見えるが、実は文字列を出力する系統のクラスにはだいたい同じ機能が含まれているので、応用範囲は広い
- 文字列を連結する方法はここで紹介している方法だけではないが、良く見る方法はだいたい網羅しているはずだ
参考リンク §
+ および += 演算子 (C# リファレンス)
String.Concat メソッド
String.Format メソッド
StringBuilder クラス
サンプルソース: stringConcat §
const string name = "カルメン";
// 方法1 単純結合法
string s1 = "私の名前は" + name + "です。";
Console.WriteLine(s1);
// 方法2 書式文字列法
string s2 = $"私の名前は{ name }です。";
Console.WriteLine(s2);
// 方法3 string.Concat法
string s3 = string.Concat("私の名前は", name, "です。");
Console.WriteLine(s3);
// 方法4 string.Format法
string s4 = string.Format("私の名前は{0}です。", name);
Console.WriteLine(s4);
// 方法5 Console.WriteLine法
Console.WriteLine("私の名前は{0}です。", name);
// 方法6 StringBuilder+Append法
var sb1 = new System.Text.StringBuilder();
sb1.Append("私の名前は");
sb1.Append(name);
sb1.Append("です。");
Console.WriteLine(sb1.ToString());
Console.WriteLine(sb1);
// 方法7 StringBuilder+AppendFormat法
var sb2 = new System.Text.StringBuilder();
sb2.AppendFormat("私の名前は{0}です。", name);
Console.WriteLine(sb2.ToString());
Console.WriteLine(sb2);
実行結果 §
私の名前はカルメンです。
私の名前はカルメンです。
私の名前はカルメンです。
私の名前はカルメンです。
私の名前はカルメンです。
私の名前はカルメンです。
私の名前はカルメンです。
私の名前はカルメンです。
私の名前はカルメンです。
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下の2つのコードは同じだろうか。違うとしたら何が違うのだろうか。
string a = "A";
string b = "B";
string c = "C";
string t;
string r1,r2;
// ケース1
t = a + b;
r1 = t + c;
Console.WriteLine(r1);
// ケース2
r2 = a + b + c;
Console.WriteLine(r2);
- 同じ。どちらもABCという結果を得る
- 違う。ケース2は文字列加算の結果により新しい文字列を1つだけ生成するが、ケース1は中間結果の文字列も生成するので文字列を2回生成する。つまり効率で劣る
[[解答]]